package config

import (
	"encoding/json"
	"os"
	"path/filepath"
)

type Config struct {
	MaxClips      int    `json:"maxClips"`
	CheckInterval int    `json:"checkInterval"` // 毫秒
	AutoStart     bool   `json:"autoStart"`
	HotKey        string `json:"hotKey"`
	SavePath      string `json:"savePath"`
	NotifyEnabled bool   `json:"notifyEnabled"`
	ImageSupport  bool   `json:"imageSupport"`
}

type Manager struct {
	config     *Config
	configPath string
}

func NewManager() (*Manager, error) {
	userConfigDir, err := os.UserConfigDir()
	if err != nil {
		return nil, err
	}

	configDir := filepath.Join(userConfigDir, "ClipPaste")
	if err := os.MkdirAll(configDir, 0755); err != nil {
		return nil, err
	}

	configPath := filepath.Join(configDir, "config.json")

	manager := &Manager{
		configPath: configPath,
		config: &Config{
			MaxClips:      1000,
			CheckInterval: 500,
			AutoStart:     true,
			HotKey:        "cmd+shift+v",
			SavePath:      filepath.Join(configDir, "clips"),
			NotifyEnabled: true,
			ImageSupport:  true,
		},
	}

	if err := manager.Load(); err != nil {
		// 如果加载失败，保存默认配置
		if err := manager.Save(); err != nil {
			return nil, err
		}
	}

	return manager, nil
}

func (m *Manager) Load() error {
	data, err := os.ReadFile(m.configPath)
	if err != nil {
		return err
	}

	return json.Unmarshal(data, m.config)
}

func (m *Manager) Save() error {
	data, err := json.MarshalIndent(m.config, "", "    ")
	if err != nil {
		return err
	}

	return os.WriteFile(m.configPath, data, 0644)
}

func (m *Manager) Get() *Config {
	return m.config
}
